/*---------------阻塞信号------------------*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void show_spending(sigset_t* sig)
{
  int i;
  printf("curr process pending:");
  for(i = 1; i <= 31; ++i)
  {
    if(sigismember((const sigset_t*)sig, i))
    {
      printf("1");
    }
    else 
    {
      printf("0");
    }
  }
  printf("\n");
}

void handler(int signo)
{
  printf("%d信号已经被抵达\n", signo);
}

int main()
{
  /*--sigset_t是一个位图结构，需要用特定的函数进行修改该类型变量--*/

  // 先通过spending实时读取当前pending位图的状态
  // 其次屏蔽2号信号，观察pending位图的状态变化
  // 然后取消对2号信号的屏蔽，自定义捕获2号信号
  // 观察pending位图的变化
  
  signal(2, handler);

  sigset_t iset, oset;
  sigemptyset(&iset);
  sigemptyset(&oset);
  // 在信号集中添加2号信号
  sigaddset(&iset, 2);
  // 设置block位图 
  sigprocmask(SIG_BLOCK, &iset, &oset);
  // 显示pending位图
  sigset_t pending;
  int count = 0;
  while(1)
  {
    sigemptyset(&pending);
    // 获取pending位图
    sigpending(&pending);
    // 显示pending位图
    show_spending(&pending);

    sleep(1);
    count++;
    if(count == 10)
    {
      // 将block位图中的屏蔽取消
      sigprocmask(SIG_SETMASK, &oset, NULL);
      printf("恢复2号信号，可以被抵达\n");
    }
  }
  return 0;
}

